home *** CD-ROM | disk | FTP | other *** search
/ Wonky Flux Batch 2019 02 / Wonky_Flux_Batch_2019-02.zip / Wonky Flux Batch 2019-02 / 089 - Misc Stuff - PD.dsk / FLOATING POINT ROUTINES.S < prev    next >
Text File  |  2019-02-17  |  6KB  |  163 lines

  1.           AST 32
  2. *                              *
  3. *    APPLE-II  FLOATING        *
  4. *      POINT ROUTINES          *
  5. *                              *
  6. *    COPYRIGHT (C) 1977        *
  7. *   APPLE COMPUTER,  INC       *
  8. *                              *
  9. *    ALL RIGHTS RESERVED       *
  10. *                              *
  11. *       S. WOZNIAK             *
  12. *                              *
  13.           AST 32
  14. *                              *
  15. *          TITLE:              *
  16. *  "FLOATING POINT  ROUTINES"  *
  17. *                              *
  18.           AST 32
  19.  
  20. SIGN      EQU $F3
  21. X2        EQU $F4
  22. M2        EQU $F5
  23. X1        EQU $F8
  24. M1        EQU $F9
  25. E         EQU $FC
  26. OVLOC     EQU $3F5
  27.  
  28.           ORG $F425
  29.  
  30.           AST 32
  31.  
  32. ADD       CLC            ;CLEAR CARRY
  33.           LDX #$2        ;INDEX FOR 3 BYTE ADD.
  34. ADD1      LDA M1,X
  35.           ADC M2,X       ;ADD A BYTE OF MANT2 TO MANT1
  36.           STA M1,X
  37.           DEX            ;INDEX TO NEXT MORE SIGNIFICANT BYTE
  38.           BPL ADD1       ;LOOP UNTIL DONE
  39.           RTS            ;RETURN
  40. MD1       ASL SIGN       ;CLEAR LSB OF SIGN
  41.           JSR ABSWAP     ;ABS VAL OF M1, THEN SWAP WITH M2
  42. ABSWAP    BIT M1         ;MANT1 NEGATIVE?
  43.           BPL ABSWAP1    ;NO, SWAP WITH MANT2 AND RETURN
  44.           JSR FCOMPL     ;YES, COMPLEMENT IT
  45.           INC SIGN       ;INCR SIGN, COMPLEMENTING LSB
  46. ABSWAP1   SEC            ;SET CARRY FOR RETURN TO MUL/DIV
  47. SWAP      LDX #$4        ;INDEX FOR 4 BYTE SWAP
  48. SWAP1     STY E-1,X
  49.           LDA X1-1,X     ;SWAP A BYTE OF EXP/MANT1 WITH
  50.           LDY X2-1,X     ;EXP/MANT2 AND LEAVE A COPY OF
  51.           STY X1-1,X     ;MANT1 IN B (3 BYTES). E+3 USED
  52.           STA X2-1,X
  53.           DEX            ;ADVANCE INDEX TO NEXT BYTE
  54.           BNE SWAP1      ;LOOP UNTIL DONE
  55.           RTS            ;RETURN
  56. FLOAT     LDA #$8E       ;INIT EXP1 TO 14,
  57.           STA X1         ;THEN NORMALIZE TO FLOAT
  58. NORM1     LDA M1         ;HIGH ORDER MANT1 BYTE
  59.           CMP #$C0       ;UPPER TWO BITS UNEQUAL?
  60.           BMI RTS1       ;YES, RETURN WITH MANT1 NORMALIZED
  61.           DEC X1         ;DECREMENT EXP1
  62.           ASL M1+2
  63.           ROL M1+1       ;SHIFT MANT1 (3 BYTES) LEFT
  64.           ROL M1
  65. NORM      LDA X1         ;EXP1 ZERO?
  66.           BNE NORM1      ;NO, CONTINUE NORMALIZING
  67. RTS1      RTS            ;RETURN
  68. FSUB      JSR FCOMPL     ;CMPL MANT1, CLEARS CARRY UNLESS 0
  69. SWPALGN   JSR ALGNSWP    ;RIGHT SHIFT MANT1 OR SWAP WITH
  70. FADD      LDA X2
  71.           CMP X1         ;COMPARE EXP1 WITH EXP2
  72.           BNE SWPALGN    ;IF #, SWAP ADDENDS OR ALIGN MANTS
  73.           JSR ADD        ;ADD ALIGNED MANTISSAS
  74. ADDEND    BVC NORM       ;NO OVERFLOW, NORMALIZE RESULT
  75.           BVS RTLOG      ;OV: SHIFT M1 RIGHT, CARRY INTO SIGN
  76. ALGNSWP   BCC SWAP       ;SWAP IF CARRY CLEAR,
  77. * ELSE SHIFT RIGHT ARITH.
  78. RTAR      LDA M1         ;SIGN OF MANT1 INTO CARRY FOR
  79.           ASL            ;RIGHT ARITH. SHIFT
  80. RTLOG     INC X1         ;INCR X1 TO ADJUST FOR RIGHT SHIFT
  81.           BEQ OVFL       ;EXP1 OUT OF RANGE
  82. RTLOG1    LDX #$FA       ;INDEX FOR 6 BYTE RIGHT SHIFT
  83. ROR1      ROR E+3,X
  84.           INX            ;NEXT BYTE OF SHIFT
  85.           BNE ROR1       ;LOOP UNTIL DONE
  86.           RTS            ;RETURN
  87. FMUL      JSR MD1        ;ABS VAL OF MANT1, MANT2
  88.           ADC X1         ;ADD EXP1 TO EXP2 FOR PRODUCT EXP
  89.           JSR MD2        ;CHECK PROD EXP AND PREPARE FOR MUL
  90.           CLC            ;CLEAR CARRY FOR FIRST BIT
  91. MUL1      JSR RTLOG1     ;M1 AND E RIGHT (PROD AND MPLIER)
  92.           BCC MUL2       ;IF CARRY CLEAR, SKIP PARTIAL PROD
  93.           JSR ADD        ;ADD MULTIPLICAND TO PRODUCT
  94. MUL2      DEY            ;NEXT MUL ITERATION
  95.           BPL MUL1       ;LOOP UNTIL DONE
  96. MDEND     LSR SIGN       ;TEST SIGN LSB
  97. NORMX     BCC NORM       ;IF EVEN, NORMALIZE PROD, ELSE COMP
  98. FCOMPL    SEC            ;SET CARRY FOR SUBTRACT
  99.           LDX #$3        ;INDEX FOR 3 BYTE SUBTRACT
  100. COMPL1    LDA #$0        ;CLEAR A
  101.           SBC X1,X       ;SUBTRACT BYTE OF EXP1
  102.           STA X1,X       ;RESTORE IT
  103.           DEX            ;NEXT MORE SIGNIFICANT BYTE
  104.           BNE COMPL1     ;LOOP UNTIL DONE
  105.           BEQ ADDEND     ;NORMALIZE (OR SHIFT RT IF OVFL)
  106. FDIV      JSR MD1        ;TAKE ABS VAL OF MANT1, MANT2
  107.           SBC X1         ;SUBTRACT EXP1 FROM EXP2
  108.           JSR MD2        ;SAVE AS QUOTIENT EXP
  109. DIV1      SEC            ;SET CARRY FOR SUBTRACT
  110.           LDX #$2        ;INDEX FOR 3 BYTE SUBTRACTION
  111. DIV2      LDA M2,X
  112.           SBC E,X        ;SUBTRACT A BYTE OF E FROM MANT2
  113.           PHA            ;SAVE ON STACK
  114.           DEX            ;NEXT MORE SIGNIFICANT BYTE
  115.           BPL DIV2       ;LOOP UNTIL DONE
  116.           LDX #$FD       ;INDEX FOR 3 BYTE CONDITIONAL MOVE
  117. DIV3      PLA            ;PULL BYTE OF DIFFERENCE OFF STACK
  118.           BCC DIV4       ;IF M2<E THEN DON'T RESTORE M2
  119.           STA M2+3,X
  120. DIV4      INX            ;NEXT LESS SIGNIFICANT BYTE
  121.           BNE DIV3       ;LOOP UNTIL DONE
  122.           ROL M1+2
  123.           ROL M1+1       ;ROLL QUOTIENT LEFT, CARRY INTO LSB
  124.           ROL M1
  125.           ASL M2+2
  126.           ROL M2+1       ;SHIFT DIVIDEND LEFT
  127.           ROL M2
  128.           BCS OVFL       ;OVFL IS DUE TO UNNORMED DIVISOR
  129.           DEY            ;NEXT DIVIDE ITERATION
  130.           BNE DIV1       ;LOOP UNTIL DONE 23 ITERATIONS
  131.           BEQ MDEND      ;NORM QUOTIENT AND CORRECT SIGN
  132. MD2       STX M1+2
  133.           STX M1+1       ;CLEAR MANT1 (3 BYTES) FOR MUL/DIV
  134.           STX M1
  135.           BCS OVCHK      ;IF CALC. SET CARRY, CHECK FOR OVFL
  136.           BMI MD3        ;IF NEG THEN NO UNDERFLOW
  137.           PLA            ;POP ONE RETURN LEVEL
  138.           PLA
  139.           BCC NORMX      ;CLEAR X1 AND RETURN
  140. MD3       EOR #$80       ;COMPLEMENT SIGN BIT OF EXPONENT
  141.           STA X1         ;STORE IT
  142.           LDY #$17       ;COUNT 24 MUL/23 DIV ITERATIONS
  143.           RTS            ;RETURN
  144. OVCHK     BPL MD3        ;IF POSITIVE EXP THEN NO OVFL
  145. OVFL      JMP OVLOC
  146. FIX1      JSR RTAR
  147. FIX       LDA X1
  148.           BPL UNDFL
  149.           CMP #$8E
  150.           BNE FIX1
  151.           BIT M1
  152.           BPL FIXRTS
  153.           LDA M1+2
  154.           BEQ FIXRTS
  155.           INC M1+1
  156.           BNE FIXRTS
  157.           INC M1
  158. FIXRTS    RTS
  159. UNDFL     LDA #$0
  160.           STA M1
  161.           STA M1+1
  162.           RTS
  163.